package com.chenyaowei.ware.service.impl;

import com.chenyaowei.common.exception.ServiceException;
import com.chenyaowei.ware.bo.OrderUnlockStockBo;
import com.chenyaowei.ware.bo.SkuStockCountBO;
import com.chenyaowei.ware.domain.CywWareSku;
import com.chenyaowei.ware.mapper.CywWareSkuMapper;
import com.chenyaowei.ware.service.ICywWareSkuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 库存管理Service业务层处理
 *
 * @author 陈耀威
 * @date 2023-11-25
 */
@Service
public class CywWareSkuServiceImpl implements ICywWareSkuService
{
    @Autowired
    private CywWareSkuMapper cywWareSkuMapper;

    /**
     * 查询库存管理
     *
     * @param id 库存管理主键
     * @return 库存管理
     */
    @Override
    public CywWareSku selectCywWareSkuById(Long id)
    {
        return cywWareSkuMapper.selectCywWareSkuById(id);
    }

    /**
     * 查询库存管理列表
     *
     * @param cywWareSku 库存管理
     * @return 库存管理
     */
    @Override
    public List<CywWareSku> selectCywWareSkuList(CywWareSku cywWareSku)
    {
        return cywWareSkuMapper.selectCywWareSkuList(cywWareSku);
    }

    /**
     * 新增库存管理
     *
     * @param cywWareSku 库存管理
     * @return 结果
     */
    @Override
    public int insertCywWareSku(CywWareSku cywWareSku)
    {
        return cywWareSkuMapper.insertCywWareSku(cywWareSku);
    }

    /**
     * 修改库存管理
     *
     * @param cywWareSku 库存管理
     * @return 结果
     */
    @Override
    public int updateCywWareSku(CywWareSku cywWareSku)
    {
        return cywWareSkuMapper.updateCywWareSku(cywWareSku);
    }

    /**
     * 批量删除库存管理
     *
     * @param ids 需要删除的库存管理主键
     * @return 结果
     */
    @Override
    public int deleteCywWareSkuByIds(Long[] ids)
    {
        return cywWareSkuMapper.deleteCywWareSkuByIds(ids);
    }

    /**
     * 删除库存管理信息
     *
     * @param id 库存管理主键
     * @return 结果
     */
    @Override
    public int deleteCywWareSkuById(Long id)
    {
        return cywWareSkuMapper.deleteCywWareSkuById(id);
    }

    /***
     * 锁库存
     * @param skuCountMap key: skuId, value: wareId
     * @return
     */
    @Transactional
    @Override
    public Map<Long, Long> lockOrderStock(Map<Long, Integer> skuCountMap) {
        Map<Long, Long> map = new HashMap<>();
        // TODO 找到就近的仓库发货。
        // 查询这些商品在哪些仓库有库存
        ArrayList<Long> skuIds = new ArrayList<>(skuCountMap.keySet());
        List<CywWareSku> list = cywWareSkuMapper.selectListBySkuIds(skuIds);
        for (Long skuId : skuIds) {
            Boolean skuStocked = false;
            List<CywWareSku> wareSkuList = list.stream().filter(item -> item.getSkuId().equals(skuId)).collect(Collectors.toList());
            // TODO 目前是找到一个够货的仓库
            for (CywWareSku cywWareSku : wareSkuList) {
                Integer count = cywWareSkuMapper.lockOrderStock(cywWareSku.getWareId(), skuId, skuCountMap.get(skuId));
                if (count == 1) {
                    skuStocked = true;
                    map.put(skuId,cywWareSku.getWareId());
                    break;
                }
            }
            if (!skuStocked) {
                throw new ServiceException("抱歉！您所在的地区，" + wareSkuList.get(0).getSkuName() + " 库存不足，剩余库存：" + wareSkuList.stream().map(item -> item.getStock() - item.getStockLocked()).max(Long::compareTo).get());
            }
        }
        return map;
    }

    @Transactional
    @Override
    public int unlockStock(List<OrderUnlockStockBo> unlockStockBos) {
        return cywWareSkuMapper.unlockStock(unlockStockBos);
    }

    @Override
    public List<SkuStockCountBO> countStockBySkuIds(List<Long> skuIds) {
        return cywWareSkuMapper.countStockBySkuIds(skuIds);
    }
}
